package it.azienda.managerworkstandard.view;

import it.azienda.framework.persistenza.DAOConnectionSingleton;
import it.azienda.framework.utilita.Utilita;
import it.azienda.framework.view.Dettaglio;
import it.azienda.managerworkstandard.modello.BeanFornitore;
import it.azienda.managerworkstandard.modello.BeanLogin;
import it.azienda.managerworkstandard.modello.BeanFatturaAcquisto;
import it.azienda.managerworkstandard.modello.BeanFatturaAcquistoDett;
import it.azienda.managerworkstandard.modello.BeanInserimentoProdotti;
import it.azienda.managerworkstandard.modello.BeanProdottoDett;
import it.azienda.managerworkstandard.modello.BeanScadenziarioAcq;
import it.azienda.managerworkstandard.modello.BeanTipoPagamento;
import java.util.ArrayList;
import java.util.GregorianCalendar;
import java.util.HashMap;
import javax.faces.application.FacesMessage;
import javax.faces.component.html.HtmlForm;
import javax.faces.component.html.HtmlInputText;
import javax.faces.component.html.HtmlSelectOneMenu;
import javax.faces.context.FacesContext;
import javax.faces.event.ValueChangeEvent;
import org.hibernate.Query;
import org.hibernate.Session;
import org.hibernate.Transaction;

public class DettaglioFatturaAcquisto extends Dettaglio {

    public DettaglioFatturaAcquisto() {
    }

    private BeanFatturaAcquisto beanFatturaAcquisto;
    private HtmlForm form = new HtmlForm();
    private ArrayList listaFatturaAcquistoDet = new ArrayList();

    public void setBeanFatturaAcquisto(BeanFatturaAcquisto beanFatturaAcquisto) {
        setObj(beanFatturaAcquisto);
        this.beanFatturaAcquisto = beanFatturaAcquisto;
    }

    public BeanFatturaAcquisto getBeanFatturaAcquisto() {
        return (BeanFatturaAcquisto) getObj();
    }

    public HtmlForm getForm() {
        form = (HtmlForm) Utilita.getSession().getAttribute("form");
        if (form == null) {
            form = new HtmlForm();
        }
        FacesContext ctx = FacesContext.getCurrentInstance();
        beanFatturaAcquisto = (BeanFatturaAcquisto) ctx.getExternalContext().getRequestMap().get("beanFatturaAcquisto");
        controlloDopoSalvataggio(beanFatturaAcquisto);
        Utilita.getSession().removeAttribute("form");
        return form;
    }

    public void setForm(HtmlForm form) {
        setFormObject(form);
        this.form = form;
        Utilita.getSession().setAttribute("form", form);
    }

    public void lookUp(ValueChangeEvent event) {
        if (event.getOldValue() != null && event.getNewValue() != null) {
            if (!event.getOldValue().toString().toUpperCase().equals(event.getNewValue().toString().toUpperCase())) {
                if (event.getNewValue().toString().length() >= 1) {

                    FacesContext ctx = FacesContext.getCurrentInstance();
                    beanFatturaAcquisto = (BeanFatturaAcquisto) ctx.getExternalContext().getRequestMap().get("beanFatturaAcquisto");
                    setObj(beanFatturaAcquisto);
                    String descrizione = new String("" + event.getNewValue());

                    String nomeBean = (String) event.getComponent().getAttributes().get("nomeBean");
                    String nomeBeanLookUp = (String) event.getComponent().getAttributes().get("nomeBeanLookUp");

                    if (nomeBean.equals("beanFornitore")) {
                        BeanFornitore beanFornitore = (BeanFornitore) lookUpRapido(descrizione.toUpperCase(), nomeBeanLookUp);
                        if (beanFornitore == null) {
                            ((HtmlInputText) form.findComponent("ragioneSocialeFornitore")).setSubmittedValue(null);
                            ((HtmlInputText) form.findComponent("codiceFornitore")).setSubmittedValue(null);
                            beanFatturaAcquisto.setBeanFornitore(new BeanFornitore());
                            setObj(beanFatturaAcquisto);
                            HtmlForm form = (HtmlForm) ctx.getViewRoot().findComponent("erroriDataBase");
                            form.setRendered(true);
                            ctx.addMessage("erroriDataBase", new FacesMessage("erroriDataBase", "Fornitore inesistente"));
                        } else {
                            beanFatturaAcquisto.setBeanFornitore(beanFornitore);
                            setObj(beanFatturaAcquisto);
                            ((HtmlInputText) form.findComponent("ragioneSocialeFornitore")).setSubmittedValue(beanFornitore.getRagioneSociale());
                            ((HtmlInputText) form.findComponent("codiceFornitore")).setSubmittedValue(beanFornitore.getCodice().toString());
                        }
                    }

                    if (nomeBean.equals("beanTipoPagamento")) {
                        BeanTipoPagamento beanTipoPagamento = (BeanTipoPagamento) lookUpRapido(descrizione.toUpperCase(), nomeBeanLookUp);
                        if (beanTipoPagamento == null) {
                            ((HtmlInputText) form.findComponent("descrizioneTipoPagamento")).setSubmittedValue(null);
                            ((HtmlInputText) form.findComponent("codiceTipoPagamento")).setSubmittedValue(null);
                            beanFatturaAcquisto.setBeanTipoPagamento(new BeanTipoPagamento());
                            setObj(beanFatturaAcquisto);
                            HtmlForm form = (HtmlForm) ctx.getViewRoot().findComponent("erroriDataBase");
                            form.setRendered(true);
                            ctx.addMessage("erroriDataBase", new FacesMessage("erroriDataBase", "TipoPagamento inesistente"));
                        } else {
                            beanFatturaAcquisto.setBeanTipoPagamento(beanTipoPagamento);
                            setObj(beanFatturaAcquisto);
                            ((HtmlInputText) form.findComponent("descrizioneTipoPagamento")).setSubmittedValue(beanTipoPagamento.getDescrizione());
                            ((HtmlInputText) form.findComponent("codiceTipoPagamento")).setSubmittedValue(beanTipoPagamento.getCodice().toString());
                        }
                    }
                    ctx.renderResponse();
                }
            }
        }
    }

    public void caricaStoricoFatturaAcquisto(Integer idFatturaAcquisto, Integer tab) {
        FacesContext ctx = FacesContext.getCurrentInstance();
        DettaglioFatturaAcquisto dettaglio = (DettaglioFatturaAcquisto) ctx.getApplication().getVariableResolver().resolveVariable(ctx, "dettaglioFatturaAcquisto");

        Query q = null;
        String query = "";
        if (tab.intValue() == 1) {
            // FatturaAcquisto Dett
            query = "select fattAcqDett from BeanFatturaAcquistoDett fattAcqDett, BeanFatturaAcquisto fatturaAcquisto"
                    + " where fatturaAcquisto.id = :id"
                    + " and fattAcqDett.beanFatturaAcquisto.id = fatturaAcquisto.id"
                    + " order by fattAcqDett.numRata";
        }
        try {
            Session sessione = DAOConnectionSingleton.newSession();

            DAOConnectionSingleton.beginTransaction();
            q = sessione.createQuery(query);
            q.setInteger("id", idFatturaAcquisto.intValue());
            ArrayList lista = (ArrayList) q.list();
            DAOConnectionSingleton.commitTransaction();

            if (lista.size() != 0) {
                if (tab.intValue() == 1) {
                    dettaglio.setListaFatturaAcquistoDet(lista);
                    BeanLogin login = (BeanLogin) Utilita.getSession().getAttribute("login");
                    login.settaHashMapStorico(lista);
                    Utilita.getSession().removeAttribute("login");
                    Utilita.getSession().setAttribute("login", login);
                }
                Utilita.getRequest().setAttribute("dettaglioFatturaAcquisto", dettaglio);
            } else {
                BeanLogin login = (BeanLogin) Utilita.getSession().getAttribute("login");
                Utilita.getSession().removeAttribute("login");
                login.setListaStorico(new HashMap());
                Utilita.getSession().setAttribute("login", login);
            }
        } catch (Exception e) {

        } finally {
            DAOConnectionSingleton.closeSession();
        }
    }

    public ArrayList getListaFatturaAcquistoDet() {
        return listaFatturaAcquistoDet;
    }

    public void setListaFatturaAcquistoDet(ArrayList listaFatturaAcquistoDet) {
        this.listaFatturaAcquistoDet = listaFatturaAcquistoDet;
    }

    public boolean controlliPrimaSalvataggio() {
        FacesContext ctx = FacesContext.getCurrentInstance();
        beanFatturaAcquisto = (BeanFatturaAcquisto) ctx.getExternalContext().getRequestMap().get("beanFatturaAcquisto");
        boolean errori = false;
        if (beanFatturaAcquisto.getBeanFornitore().getId() == null) {
            HtmlForm form = (HtmlForm) ctx.getViewRoot().findComponent("erroriDataBase");
            form.setRendered(true);
            ctx.addMessage("erroriDataBase", new FacesMessage("Attenzione: Fornitore obbligatorio!"));
            errori = true;
        }
        if (beanFatturaAcquisto.getBeanTipoPagamento().getId() == null) {
            HtmlForm form = (HtmlForm) ctx.getViewRoot().findComponent("erroriDataBase");
            form.setRendered(true);
            ctx.addMessage("erroriDataBase", new FacesMessage("Attenzione: Tipo Pagamento obbligatorio!"));
            errori = true;
        }

        if (beanFatturaAcquisto.getId() == null) {
            String query = " select max(beanFatturaAcquisto.codice) from BeanFatturaAcquisto beanFatturaAcquisto";
            Session session = null;
            try {
                session = DAOConnectionSingleton.newSession();
                Query q = null;
                DAOConnectionSingleton.beginTransaction();
                q = session.createQuery(query);
                Integer cod = (Integer) q.uniqueResult();
                DAOConnectionSingleton.commitTransaction();
                if (cod != null) {
                    this.beanFatturaAcquisto.setCodice(new Integer(cod.intValue() + 1));
                } else {
                    this.beanFatturaAcquisto.setCodice(new Integer(1));
                }
            } catch (Exception e) {

            }
        }

        if (errori) {
            controlloDopoSalvataggio(beanFatturaAcquisto);
            return true;
        }
        return false;
    }

    public void controlloDopoSalvataggio(Object obj) {
        BeanFatturaAcquisto fatturaAcquisto = (BeanFatturaAcquisto) obj;
        if (fatturaAcquisto.getBeanFornitore() == null) {
            fatturaAcquisto.setBeanFornitore(new BeanFornitore());
        } else {
            try {
                if (fatturaAcquisto.getBeanFornitore().getId() != null) {
                    BeanFornitore beanFornitore = new BeanFornitore();
                    beanFornitore = (BeanFornitore) beanFornitore.dettaglio(fatturaAcquisto.getBeanFornitore().getId());
                    fatturaAcquisto.setBeanFornitore(beanFornitore);
                }
            } catch (Exception e) {
            }
        }

        if (fatturaAcquisto.getBeanTipoPagamento() == null) {
            fatturaAcquisto.setBeanTipoPagamento(new BeanTipoPagamento());
        } else {
            try {
                if (fatturaAcquisto.getBeanTipoPagamento().getId() != null) {
                    BeanTipoPagamento beanTipoPagamento = new BeanTipoPagamento();
                    beanTipoPagamento = (BeanTipoPagamento) beanTipoPagamento.dettaglio(fatturaAcquisto.getBeanTipoPagamento().getId());
                    fatturaAcquisto.setBeanTipoPagamento(beanTipoPagamento);
                }
            } catch (Exception e) {
            }
        }
        BeanLogin login = (BeanLogin) Utilita.getSession().getAttribute("login");
        login.settaHashMapStorico(new ArrayList());
        Utilita.getSession().removeAttribute("login");
        Utilita.getSession().setAttribute("login", login);
    }

    public void dopoInserimento(Object obj) {
        try {
            Double importo = new Double("0");
            if (this.beanFatturaAcquisto.getNumeroRate() != null && this.beanFatturaAcquisto.getTotale() != null) {
                importo = arrotonda(new Double(this.beanFatturaAcquisto.getTotale().doubleValue() / this.beanFatturaAcquisto.getNumeroRate().intValue()), 2);
            }
            java.sql.Date dd = new java.sql.Date(this.beanFatturaAcquisto.getData().getTime());

            String[] dataSplit = dd.toString().split("-");
            Integer giorno = new Integer(dataSplit[2].toString());
            Integer mese = new Integer(dataSplit[1].toString());
            Integer anno = new Integer(dataSplit[0].toString());

            for (int i = 0; i < this.beanFatturaAcquisto.getNumeroRate().intValue(); i++) {
                if (i == this.beanFatturaAcquisto.getNumeroRate().intValue()) {
                    Double controllo = new Double((this.beanFatturaAcquisto.getNumeroRate().intValue() - 1) * importo.doubleValue());
                    controllo = arrotonda(controllo, 2);
                    importo = arrotonda(new Double(this.beanFatturaAcquisto.getTotale().doubleValue() - controllo.doubleValue()), 2);
                }
                BeanFatturaAcquistoDett fatturaAcquistoDett = new BeanFatturaAcquistoDett();
                fatturaAcquistoDett.setBeanFatturaAcquisto(this.beanFatturaAcquisto);
                fatturaAcquistoDett.setNumRata(new Integer(i + 1));
                fatturaAcquistoDett.setImportoRata(importo);
                fatturaAcquistoDett.setPagato("N");

                GregorianCalendar calendar = new GregorianCalendar(anno.intValue(), mese.intValue() - 1, 1);
                java.sql.Date nuovaData = java.sql.Date.valueOf(anno.toString() + "-" + mese.toString() + "-" + calendar.getActualMaximum(GregorianCalendar.DAY_OF_MONTH));
                fatturaAcquistoDett.setScadenza(new java.util.Date(nuovaData.getTime()));

                if (mese.intValue() == 12) {
                    mese = new Integer(1);
                    anno = new Integer(anno.intValue() + 1);
                } else {
                    mese = new Integer(mese.intValue() + 1);
                }
                fatturaAcquistoDett.inserisci();
            }

            //Inserisco lo scadenziarioIvaFatt
            BeanScadenziarioAcq beanScadenziarioAcq = new BeanScadenziarioAcq(this.beanFatturaAcquisto);
            beanScadenziarioAcq.inserisci();

        } catch (Exception e) {
            controlloDopoSalvataggio(this.beanFatturaAcquisto);
        }
    }

    public Double arrotonda(Object obj, int precisione) {
        Double valore = (Double) obj;
        Double valoreArr = new Double(0);
        double pot = Math.pow(10, precisione);
        double v = valore.doubleValue() * pot;
        valoreArr = new Double(Math.round(v) / pot);
        return valoreArr;
    }

    public void cambioImponibile(ValueChangeEvent event) {

        Double imponibile = new Double(0);
        try {
            imponibile = (Double) event.getNewValue();
        } catch (Exception ex) {
            System.out.println("Errore: " + ex.toString());
        }
        if (imponibile == null) {
            imponibile = new Double(0);
            HtmlInputText inputText = (HtmlInputText) form.findComponent("imponibile");
            inputText.setValue(new Double(0));
            inputText.setRendered(true);
        }

        Double iva = new Double(0);
        HtmlInputText inputTextIva = (HtmlInputText) form.findComponent("iva");
        if (inputTextIva.getValue() != null) {
            iva = (Double) inputTextIva.getValue();
        } else {
            inputTextIva.setValue(new Double(0));
            inputTextIva.setRendered(true);
        }

        BeanFatturaAcquisto fattAcq = (BeanFatturaAcquisto) Utilita.getRequest().getAttribute("beanFatturaAcquisto");
        fattAcq.setImposta(arrotonda(imponibile / 100 * iva, 2));
        fattAcq.setTotale(arrotonda(imponibile + fattAcq.getImposta(), 2));

        Utilita.getRequest().setAttribute("beanFatturaAcquisto", fattAcq);

        return;
    }

    public void cambioIva(ValueChangeEvent event) {

        Double iva = new Double(0);
        try {
            iva = (Double) event.getNewValue();
        } catch (Exception ex) {
            System.out.println("Errore: " + ex.toString());
        }
        if (iva == null) {
            iva = new Double(0);
            HtmlInputText inputText = (HtmlInputText) form.findComponent("iva");
            inputText.setValue(new Double(0));
            inputText.setRendered(true);
        }

        Double imponibile = new Double(0);
        HtmlInputText inputTextImponibile = (HtmlInputText) form.findComponent("imponibile");
        if (inputTextImponibile.getValue() != null) {
            imponibile = (Double) inputTextImponibile.getValue();
        } else {
            inputTextImponibile.setValue(new Double(0));
            inputTextImponibile.setRendered(true);
        }

        BeanFatturaAcquisto fattAcq = (BeanFatturaAcquisto) Utilita.getRequest().getAttribute("beanFatturaAcquisto");
        fattAcq.setImposta(arrotonda(imponibile / 100 * iva, 2));
        fattAcq.setTotale(arrotonda(imponibile + fattAcq.getImposta(), 2));

        Utilita.getRequest().setAttribute("beanFatturaAcquisto", fattAcq);

        return;
    }

}
